大家好,我是一名菜鳥工程師,這篇文章用來記錄我工作遇到的需求及解決方式,如果有更好的解決方式,也歡迎大家提出,話不多說,趕快開始今天的教學吧。
這次遇到的問題主要是客戶反映了某筆資料點入編輯頁的時候會出現錯誤,實際去查詢原因後,在進入編輯頁的時候,會對某個table紀錄更新時間,但奇怪的是只有這筆資料會出現錯誤,其他筆資料都正常運作。
實際用SQL Server下指令後,SQL 會報出這個錯誤
求助Google大神後,發現造成這個問題的原因,可能是資料庫發生毀損,所以先在SQL Server用了 DBCC CHECKDB
對資料庫進行檢查,不檢查還好,一檢查發現有很多table都有發生配置錯誤或是一致性錯誤,因此接下來就必須進行DB修復工作
SQL Server 有提供修復DB的指令一共分成3種
根據Microsoft Docs的解釋,第一種的REPAIR_FAST不會進行任何修復動作,會進行修復只有REPAIR_REBUILD及REPAIR_ALLOW_DATA_LOSS,經過實際測試 REPAIR_ALLOW_DATA_LOSS可以修復大部分table出現的錯誤,至於資料部分就不一定了,因為平常該資料庫會一個星期備份一次,我拿了兩個時間備份的DB測試,一個資料沒有因修復而被刪除,一個資料則有,所以如果真的要用還是先備份一下資料庫比較好。
在修復完成後,再跑一次DBCC CHECKDB確認一下資料庫,結果還是有錯誤
這下子就麻煩了,因為這個錯誤在修復過程中,是直接顯示"無法修復此錯誤" 然後被跳過去
好吧既然無法完全修復,那就試試看別條路,所幸Visual Studio 內建提供一個SQL 比較工具,可以比較兩個DB間的結構和資料,再加上查了備份檔後,發現是從某個星期開始出現問題,因此在那個星期前的DB都是正常沒有任何錯誤的狀態
因此與公司的主管和MIS討論後,決定利用這個工具,將目前的DB的結構與資料全部抄寫進入完整無錯誤的舊DB,然後確認資料與原先DB皆相同後,就改用這個複製的DB,在這麼做後,目前運作還算是正常,不過主管還是提醒,因為比較是由軟體比較的,到底有沒有完整比較然後複製過去還是必須觀察。
接下來我就稍微介紹一下Visual Studio 內建SQL工具。
以下是我修復步驟
2.來源資料庫請選擇 有問題的DB
3.目標資料庫選擇完整無誤的DB,好了點選下一步
4.兩個都打勾
5.比對完成後,點選更新目標
比對完成後,中間的三欄分別代表新增、更新、刪除,最後一欄則是兩個DB相同紀錄
6.確認是否更新完成後,點擊重新整理,此時會再重新比對一次
7.確認比對完成的兩個DB無差異,中間三欄數字應為0,表示這兩個DB資料已無差異
8.最後執行sql : DBCC CHECKDB ('資料庫名稱'); 確認DB狀態
要注意的是這個比較只會比較結構相同和有設PK的table,所以在做資料比對之前務必先確定table的狀態,避免沒被比較到
經過這次的事件,讓我體會到備份的重要性,也希望這篇文章能幫助到遇到一樣問題的人